package com.wang.aopdemo.aspect;

import com.wang.aopdemo.annotation.CheckAccountBan;
import com.wang.aopdemo.annotation.CheckMuteBan;
import com.wang.aopdemo.domain.User;
import com.wang.aopdemo.enums.BanTypeEnum;
import com.wang.aopdemo.service.IUserService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author yandong
 */
@Aspect
@Component
public class BanAspect {

    @Autowired
    private IUserService userService;

//    @Pointcut("@annotation(com.wang.aopdemo.annotation.CheckAccountBan)")
//    public void checkAccountBan() {
//    }
//
//    @Pointcut("@annotation(com.wang.aopdemo.annotation.CheckMuteBan)")
//    public void checkMuteBan() {
//    }

    // 拦截标记 @CheckAccountBan 的方法（如登录操作）
    @Before("@annotation(com.wang.aopdemo.annotation.CheckAccountBan) && args(userId)")
    public void before(String userId) {
        User user = userService.getUserInfo(userId);
        if (user == null) {
            return;
        }
        if (user.getBanType() == BanTypeEnum.ACCOUNT_BAN) {
            // 若用户被封号且未到期 --> 抛出异常
            String expireTime = user.getBanExpireTime();
            if (!expireTime.isEmpty() && isExpireTimeValid(expireTime)) {
                throw new RuntimeException("用户已被封号, 无法进行后续操作");
            }
        }
    }

    // 拦截标记 @CheckMuteBan 的方法（如发送评论）
    @Before("@annotation(com.wang.aopdemo.annotation.CheckMuteBan) && args(userId)")
    public void checkMute(String userId) {
        User user = userService.getUserInfo(userId);
        if (user == null) {
            return;
        }
        if (user.getBanType() == BanTypeEnum.MUTE) {
            // 若用户被禁言且未到期 --> 抛出异常
            String expireTime = user.getBanExpireTime();
            if (!expireTime.isEmpty() && isExpireTimeValid(expireTime)) {
                throw new RuntimeException("用户已被禁言, 暂不能进行后续操作");
            }
        }

    }

    /**
     * 校验到期时间是否有效 (当前时间 < 到期时间)
     * @param expireTime 到时期间
     * @return true:有效  false:无效
     */
    private boolean isExpireTimeValid(String expireTime) {
        // TODO 实际项目中需实现日期的比较, 此处假设未到期, 直接返回true.
        return true;
    }
}
